\chapter{Gestion des directives}
L'objectif est de permettre à l'utilisateur de sélectionner les fonctions qu'il souhaite utiliser. Pour cela il pourra ajouter un plusieurs pragmas de la forme :

\begin{lstlisting}
#pragma instrument function toto
#pragma instrument function (titi,tata,tutu)
\end{lstlisting}

\section{Implémentation}

Le pragma est géré à l'aide d'un register\_callback.
La forme du pragma est vérifiée à l'aide de la fonction {\tt c\_register\_pragma}, puis les arguments sont parsés par la fonction {\tt handle\_pragma}.

\section{Gestion des arguments}

\noindent La fonction {\tt handle\_pragma} remplit les tâches suivantes :
\begin{itemize}
  \item Parser les arguments de la directive.
  \item Générer les messages d'erreurs : en cas de pragma malformé ou de pragma déclaré à l'intérieur d'une fonction.
  \item Récupérer les noms des fonctions instrumentées et les insérer dans un vecteur.
  \item Dédoublonner si nécessaire et générer un warning le cas échéant.\end{itemize}

\noindent Pour gérer correctement les arguments de la directive nous avons défini des règles :
\begin{itemize}
  \item S'l y a plusieurs fonctions, les mettre entre parenthèses.
  \item Séparer les noms des fonctions par des virgules.
  \item Indiquer les noms sans guillemets.
\end{itemize}
Lorsque ces règles ne sont pas respectées, nous générons un message d'erreur à l'aide d'une macro qui fait appel à la fonction {\tt error()} de gcc.

Pour implémenter ces règles nous avons mis en place un automate, que nous avons ensuite codé à l'aide d'une machine à états.
Cela permet de récupérer différents types d'erreurs (parenthèse manquante, virgules successives) et de spécifier le message d'erreur adéquat.

\begin{figure}[htb]
	\begin{center}
		\includegraphics[width=15cm]{images/PragmaArgsParser.png}
		\caption{Automate représentant la grammaire. En rouge : passage en état d'erreur}
	\end{center}
\end{figure}

En sortie nous récupérons deux vecteurs : un premier vecteur contenant les fonctions à instrumenter lors de la passe statique contenant les fonctions énumérées par l'utilisateur, un autre vecteur avec les mêmes fonctions, auquel nous rajoutons la fonction {\tt main}, qui servira pour la passe dynamique.

L'utilisateur peut également écrire plusieurs directives \#pragma instrument, les fonctions sont traitées de la même manière et ajoutées aux vecteurs existants.

Notons que lors du release du plugin, nous vérifions que les fonctions instrumentées existent bien dans le code source. Cette vérification est simple~: à chaque fois qu'une fonction est traitée elle est retirée du vecteur. A la fin, s'il reste des fonctions dans le vecteur, nous générons un warning pour en prévenir l'utilisateur.
